#include <kernel.h>
#include <type.h>
#include <io.h>
#include <string.h>
#include <console.h>
#include <stdarg.h>
#include <printk.h>
#include <assert.h>
#include <debug.h>

// #define CRT_ADDR_REG 0X3d4
// #define CRT_DATA_REG 0X3d5
// #define CRT_CURSOR_H 0Xe
// #define CRT_CURSOR_L 0Xf

int magicData = KERNEL_MAGIC;
char msgStart[] = "entry c code, kernel start!\n"; // 将存储在.data段


void kernel_init()
{
    // char *txtScreenAdr = (char *) 0xb8000; // 文本显示器的内存位置
    // for (int i = 0; i < sizeof(msgStart); ++i) {
    //     txtScreenAdr[i * 2] = msgStart[i];
    // }
    // outByte(CRT_ADDR_REG, CRT_CURSOR_H); // 将8bit 光标高地址写入到CRT_ADDR_REG地址端口中
    // u16 pos = inByte(CRT_DATA_REG) << 8; // 读入上一行设置好的光标高八位地址对应的数据，因为是高地址，所以左移8位，以获取光标当前位置
    // outByte(CRT_ADDR_REG, CRT_CURSOR_L); // 继续设置表示要读取光标低地址
    // pos |= inByte(CRT_DATA_REG); // 获取到光标位置
    // // 接下来修改光标的位置
    // outByte(CRT_ADDR_REG, CRT_CURSOR_H);
    // outByte(CRT_DATA_REG, 0);
    // outByte(CRT_ADDR_REG, CRT_CURSOR_L);
    // outByte(CRT_DATA_REG, 100);
    // char buf[20];
    // int res = strcpy(buf, msgStart);
    ConsoleInit();
    GdtInit();
    ConsoleWrite(msgStart, sizeof(msgStart) - 1);
    // test_args(5, 0xaa, 1, 2, 3, 0x55);
    // while(true)ConsoleWrite(msgStart, sizeof(msgStart) - 1);
    for (int i = 0; i < 30; i++) {
        printk("test printk %#010x\n", i);
    }
    // ASSERT(3<5);
    // ASSERT(3>5);
    // Panic("panic test");
    LOG_DEBUGK("test debug %d", 5);
    LOG_INFOK("test info %d", 6);
    LOG_WARNK("test warn %d", 7);
    LOG_ERRORK("test error %d", 8);
}

